class_name HPlayerItemUseAbility
extends HItemUseAbility

## 玩家物品使用能力类
## 继承自HItemUseAbility，专门处理玩家的输入节点和视角相关的物品使用逻辑
## 负责创建包含玩家特定信息的使用上下文

## 使用当前选中的物品（玩家版本）
## @param item_manager: 物品管理能力
## @param user_entity: 使用者实体
## @param input_node: 输入节点
func use_current_item(item_manager: HItemManageAbility, user_entity: Entity, input_node: HCharacterInputNode):
	# 获取当前选中的物品容器
	var item_container = item_manager.get_current_item_container()
	if not item_container:
		print("没有选中的物品")
		return
	
	# 创建物品实例
	var item_instance = item_container.create_item_instance()
	if not item_instance:
		print("无法创建物品实例")
		return
	
	# 创建玩家专用的使用上下文
	var context = create_player_use_context(user_entity, input_node)
	
	# 使用物品
	item_instance.item_use(context)

## 创建玩家专用的物品使用上下文
## 包含玩家视角、位置等特定信息
## @param user_entity: 使用者实体
## @param input_node: 输入节点
## @return PlayerItemUseContext: 玩家专用的使用上下文
func create_player_use_context(user_entity: Entity, input_node: HCharacterInputNode) -> PlayerItemUseContext:
	var context = PlayerItemUseContext.new(user_entity, input_node, get_parent())
	
	# 计算玩家特有的投掷信息
	var throw_direction = _calculate_throw_direction(input_node)
	var launch_position = _calculate_launch_position(user_entity, input_node)
	
	# 通过玩家上下文的方法设置投掷信息
	context.set_player_throw_info(launch_position, throw_direction)
	
	# 设置目标位置（基于射线检测结果，用于非投掷物品）
	var target_position = _calculate_target_position(input_node)
	context.set_target_position(target_position)
	
	return context

## 计算目标位置
## 基于射线检测结果
## @param input_node: 输入节点
## @return Vector3: 目标位置
func _calculate_target_position(input_node: HCharacterInputNode) -> Vector3:
	# 默认目标距离
	var default_distance = 10.0
	
	# 尝试从射线检测获取目标点
	var raycast_ability = _get_raycast_ability()
	if raycast_ability and raycast_ability.ray_cast_3d and raycast_ability.ray_cast_3d.is_colliding():
		return raycast_ability.ray_cast_3d.get_collision_point()
	
	# 如果没有射线碰撞，使用摄像机前方向计算目标点
	if input_node and input_node.RotXNode:
		var camera_forward = -input_node.RotXNode.global_transform.basis.z
		var start_position = input_node.RotXNode.global_position
		return start_position + camera_forward * default_distance
	
	return Vector3.ZERO

## 获取射线检测能力
## @return HAbilityRayCast: 射线检测能力实例，如果未找到返回null
func _get_raycast_ability() -> HAbilityRayCast:
	var abilities_parent = get_parent()
	if not abilities_parent:
		return null
	
	for child in abilities_parent.get_children():
		if child is HAbilityRayCast:
			return child
	
	return null

## 计算玩家的投掷方向
## 基于摄像机视角方向
## @param input_node: 输入节点
## @return Vector3: 标准化的投掷方向向量
func _calculate_throw_direction(input_node: HCharacterInputNode) -> Vector3:
	if not input_node or not input_node.RotXNode:
		print("警告：无法获取摄像机节点，使用默认前方向")
		return Vector3.FORWARD
	
	# 获取摄像机的前方向向量（考虑了X和Y轴旋转）
	var camera_forward = -input_node.RotXNode.global_transform.basis.z
	
	return camera_forward.normalized()

## 计算玩家的投掷起始位置
## 基于摄像机位置并添加偏移
## @param user_entity: 使用者实体
## @param input_node: 输入节点
## @return Vector3: 投掷起始位置
func _calculate_launch_position(user_entity: Entity, input_node: HCharacterInputNode) -> Vector3:
	if not input_node or not input_node.RotXNode:
		# 如果无法获取摄像机位置，使用角色位置
		return user_entity.attach_node.global_position if user_entity and user_entity.attach_node else Vector3.ZERO
	
	# 使用摄像机位置作为发射起点
	var camera_position = input_node.RotXNode.global_position
	
	# 稍微向前偏移，避免投掷物卡在摄像机位置
	var camera_forward = -input_node.RotXNode.global_transform.basis.z
	var offset_position = camera_position + camera_forward * 0.5
	
	return offset_position
